//@ sourceURL=transformPoint.js

(function(root, factory) {
	if(typeof define === 'function' && define.amd) {
		// AMD. Register as an anonymous module.
		define([], factory);
	} else if(typeof module === 'object' && module.exports) {
		// Node. Does not work with strict CommonJS, but
		// only CommonJS-like environments that support module.exports,
		// like Node.
		module.exports = factory();
	} else {
		// Browser globals (root is window)
		root.coordtransform = factory();
	}
}(this, function() {
	//定义一些常量
	var x_PI = 3.14159265358979324 * 3000.0 / 180.0;
	var PI = 3.1415926535897932384626;
	var a = 6378245.0;
	var ee = 0.00669342162296594323;
	/**
	 * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换
	 * 即 百度 转 谷歌、高德
	 * @param bd_lon
	 * @param bd_lat
	 * @returns {*[]}
	 */
	var bd09togcj02 = function bd09togcj02(bd_lon, bd_lat) {
		var bd_lon = +bd_lon;
		var bd_lat = +bd_lat;
		var x = bd_lon - 0.0065;
		var y = bd_lat - 0.006;
		var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_PI);
		var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_PI);
		var gg_lng = z * Math.cos(theta);
		var gg_lat = z * Math.sin(theta);
		return [gg_lng, gg_lat]
	};

	/**
	 * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换
	 * 即谷歌、高德 转 百度
	 * @param lng
	 * @param lat
	 * @returns {*[]}
	 */
	var gcj02tobd09 = function gcj02tobd09(lng, lat) {
		var lat = +lat;
		var lng = +lng;
		var z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI);
		var theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI);
		var bd_lng = z * Math.cos(theta) + 0.0065;
		var bd_lat = z * Math.sin(theta) + 0.006;
		return [bd_lng, bd_lat]
	};

	/**
	 * WGS84转GCj02
	 * @param lng
	 * @param lat
	 * @returns {*[]}
	 */
	var wgs84togcj02 = function wgs84togcj02(lng, lat) {
		var lat = +lat;
		var lng = +lng;
		if(out_of_china(lng, lat)) {
			return [lng, lat]
		} else {
			var dlat = transformlat(lng - 105.0, lat - 35.0);
			var dlng = transformlng(lng - 105.0, lat - 35.0);
			var radlat = lat / 180.0 * PI;
			var magic = Math.sin(radlat);
			magic = 1 - ee * magic * magic;
			var sqrtmagic = Math.sqrt(magic);
			dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
			dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
			var mglat = lat + dlat;
			var mglng = lng + dlng;
			return [mglng, mglat]
		}
	};

	/**
	 * GCJ02 转换为 WGS84
	 * @param lng
	 * @param lat
	 * @returns {*[]}
	 */
	var gcj02towgs84 = function gcj02towgs84(lng, lat) {
		var lat = +lat;
		var lng = +lng;
		if(out_of_china(lng, lat)) {
			return [lng, lat]
		} else {
			var dlat = transformlat(lng - 105.0, lat - 35.0);
			var dlng = transformlng(lng - 105.0, lat - 35.0);
			var radlat = lat / 180.0 * PI;
			var magic = Math.sin(radlat);
			magic = 1 - ee * magic * magic;
			var sqrtmagic = Math.sqrt(magic);
			dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
			dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
			var mglat = lat + dlat;
			var mglng = lng + dlng;
			return [lng * 2 - mglng, lat * 2 - mglat]
		}
	};

	var transformlat = function transformlat(lng, lat) {
		var lat = +lat;
		var lng = +lng;
		var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
		ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
		ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
		ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
		return ret
	};

	var transformlng = function transformlng(lng, lat) {
		var lat = +lat;
		var lng = +lng;
		var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
		ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
		ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;
		ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
		return ret
	};

	/**
	 * 判断是否在国内，不在国内则不做偏移
	 * @param lng
	 * @param lat
	 * @returns {boolean}
	 */
	var out_of_china = function out_of_china(lng, lat) {
		var lat = +lat;
		var lng = +lng;
		// 纬度3.86~53.55,经度73.66~135.05 
		return !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55);
	};

	return {
		bd09togcj02: bd09togcj02,
		gcj02tobd09: gcj02tobd09,
		wgs84togcj02: wgs84togcj02,
		gcj02towgs84: gcj02towgs84
	}
}));


/** 单个百度坐标转换成大地坐标系，返回obj{lng:?,lat:?}*/
function toWGS84(point){
	//先转成火星坐标系 ，百度转GCj02
//	bd09togcj02   gcj02towgs84
	var x=point.lng?point.lng:point.x;
	var y=point.lat?point.lat:point.y;
	if(x&&y){
		x=parseFloat(x);
		y=parseFloat(y);
		/**判断经纬度是否在中国境内*/
		if((135.05 > x && x > 73.67) && (53.55 > y && y > 3.87)) {
		 	//原始坐标转换为百度地图坐标star
			//先转成火星坐标系 ，WGS84转GCj02
			
		 	var valueObj={lng: x, lat:y};
			var gcj02Point=coordtransform.bd09togcj02(valueObj.lng,valueObj.lat);
			var point3={lng:gcj02Point[0],lat:gcj02Point[1]};
			//再由火星坐标系转成百度坐标系 GCj02转成(WGS84)
			var baiduPoint=coordtransform.gcj02towgs84(point3.lng, point3.lat);
			point.lng=baiduPoint[0];
			point.lat=baiduPoint[1];
			return point;
		}
		else{
			return false;
		}
	}
	else{
		return false;
	}
}


/** 数组n个转换成大地坐标系数组并返回Arr*/
function toWGS84Arr(dataArr) {
	//1.先过滤坐标为0.0，null，undefined，''等情况的数据
	var resultArr = [];
	var param=[]; 
		param=dataArr;
	for(var i = 0; len = param.length, i < len; i++) {

		var x = param[i].x ? param[i].x : param[i].lng;
		var y = param[i].y ? param[i].y : param[i].lat;
		x = parseFloat(x);
		y = parseFloat(y);

		if((135.05 > x && x > 73.67) && (53.55 > y && y > 3.87)) {

			//先转成火星坐标系 ，WGS84转GCj02
			var valueObj = {
				lng: x,
				lat: y
			};
			var gcj02Point = coordtransform.bd09togcj02(valueObj.lng, valueObj.lat);
			var point3 = {
				lng: gcj02Point[0],
				lat: gcj02Point[1]
			};
			//再由火星坐标系转成大地坐标系 GCj02转成(WGS84)
			var baiduPoint = coordtransform.gcj02towgs84(point3.lng, point3.lat);

			param[i].lng = baiduPoint[0];
			param[i].lat = baiduPoint[1];
			if(param[i].uploadDate){
				param[i].loc_time = new Date(param[i].uploadDate).getTime();
			}
			
			resultArr.push(param[i]);

		}

	}

	return resultArr;

}


//高德坐标系GCj02转大地坐标
function AMapToWgs4(lng, lat){
	var result;
	if((135.05 > +lng && +lng > 73.67) && (53.55 > +lat && +lat > 3.87)) {
		let point=coordtransform.gcj02towgs84(lng, lat);
		if(point){
			result={lng:point[0],lat:point[1]};
		}
	}
	return result;
}

//大地坐标系 转成高德坐标
function toAMapPoint(lng, lat){
	var result;
	if((135.05 > +lng && +lng > 73.67) && (53.55 > +lat && +lat > 3.87)) {
		let point=coordtransform.wgs84togcj02(lng, lat);
		if(point){
			result={lng:point[0],lat:point[1]};
		}
	}
	return result;
}

const inChina = [
	// [纬度, 经度, 纬度, 经度] // 左上角坐标点，右下角坐标点
	[49.2204, 79.4462, 42.8899, 96.33],
	[54.1415, 109.6872, 39.3742, 135.0002],
	[42.8899, 73.1246, 29.5297, 124.143255],
	[29.5297, 82.9684, 26.7186, 97.0352],
	[29.5297, 97.0253, 20.414096, 124.367395],
	[20.414096, 107.975793, 17.871542, 111.744104]
  ]

  const outChina = [
	// [纬度, 经度, 纬度, 经度]
	// [25.398623, 119.921265, 21.785006, 122.497559], // 台湾省
	[22.284, 101.8652, 20.0988, 106.665],
	[21.5422, 106.4525, 20.4878, 108.051],
	[55.8175, 109.0323, 50.3257, 119.127],
	[55.8175, 127.4568, 49.5574, 137.0227],
	[44.8922, 131.2662, 42.5692, 137.0227]
  ]

function isInsideChina(longitude, latitude) {
	for (let i = 0; i < 6; i++) {
	  if (
		latitude <= inChina[i][0] &&
		latitude >= inChina[i][2] &&
		longitude >= inChina[i][1] &&
		longitude <= inChina[i][3]
	  ) {
		for (let j = 0; j < 5; j++) {
		  if (
			latitude <= outChina[j][0] &&
			latitude >= outChina[j][2] &&
			longitude >= outChina[j][1] &&
			longitude <= outChina[j][3]
		  ) {
			return false
		  }
		}
		return true
	  }
	}
	return false
}

/** 转换成百度坐标系，返回obj{lng:?,lat:?}*/
function toMapPoint(point) {
	//先转成火星坐标系 ，WGS84转GCj02
	var x = point.lng ? point.lng : point.x;
	var y = point.lat ? point.lat : point.y;
	if(!x&&!y){
		x=point.longitude;
		y=point.lantitude;
	}
	if(!x || !y) return false // 过滤经纬度为空的点

	x = parseFloat(x);
	y = parseFloat(y);

	// 如果是国内的经纬度点则需要转化百度坐标系
	const insideChina = isInsideChina(x, y)
	if(insideChina) {
		if((135.05 > x && x > 73.67) && (53.55 > y && y > 3.87)) {
			//先转成火星坐标系 ，WGS84转GCj02
			var changePoint = {};
			var valueObj = {
				lng: x,
				lat: y
			};
			var gcj02Point = coordtransform.wgs84togcj02(valueObj.lng, valueObj.lat);
			var point3 = {
				lng: gcj02Point[0],
				lat: gcj02Point[1]
			};
			//再由火星坐标系转成百度坐标系 GCj02转成(BD-09)
			var baiduPoint = coordtransform.gcj02tobd09(point3.lng, point3.lat);
			point.lng = baiduPoint[0];
			point.lat = baiduPoint[1];
			if(point.uploadDate){
				point.loc_time = new Date(point.uploadDate).getTime();
			}
			return point;
		} else {
			return false;
		}
	} else {
		point.lng = x;
		point.lat = y;
		if(point.uploadDate){
			point.loc_time = new Date(point.uploadDate).getTime();
		}
		return point;
	}
}

/**
 * 时间格式年：月：日 时：分：秒转成时间戳函数
 * @param date
 * @returns {String}
 */
var changeTime = function changeTime(str) {
	var date = str.substring(0, 19);
	var timestamp = new Date(date).getTime();
	return timestamp;
};

/**
 * 将数据对象数组转换成百度坐标系数组并返回Arr
 * param 数据源
*/
function toMapPointArr(param) {
//1.先过滤坐标为0.0，null，undefined，''等情况的数据
	var resultArr = [];
	for(var i = 0; len = param.length, i < len; i++) {
		var x = param[i].x ? param[i].x : param[i].lng;
		var y = param[i].y ? param[i].y : param[i].lat;
		if(!x&&!y){
			x=param[i].longitude;
			y=param[i].lantitude;
		}

		if(!x || !y) continue // 过滤经纬度为空的点

		x = parseFloat(x);
		y = parseFloat(y);
		// 如果是国内的经纬度点则需要转化百度坐标系
		const insideChina = isInsideChina(x, y)
		if(insideChina) {
			if((135.05 > x && x > 73.67) && (53.55 > y && y > 3.87)) {
				//先转成火星坐标系 ，WGS84转GCj02
				var valueObj = {
					lng: x,
					lat: y
				};
				var gcj02Point = coordtransform.wgs84togcj02(valueObj.lng, valueObj.lat);
				var point3 = {
					lng: gcj02Point[0],
					lat: gcj02Point[1]
				};
				//再由火星坐标系转成百度坐标系 GCj02转成(BD-09)
				var baiduPoint = coordtransform.gcj02tobd09(point3.lng, point3.lat);
				param[i].lng = baiduPoint[0];
				param[i].lat = baiduPoint[1];
				if(param[i].uploadDate){
					const dateStr = param[i].uploadDate.split('-').join('/');
					param[i].loc_time = new Date(dateStr).getTime();
				}
				resultArr.push(param[i]);
			}
		} else {
			param[i].lng = x;
			param[i].lat = y;
			if(param[i].uploadDate){
				const dateStr = param[i].uploadDate.split('-').join('/');
				param[i].loc_time = new Date(dateStr).getTime();
			}
			resultArr.push(param[i]);
		}
	}
	return resultArr;
}


/** 将数据对象数组转换成高德标系数组并返回Arr*/
function toAMapPointArr(param) {
	//1.先过滤坐标为0.0，null，undefined，''等情况的数据
	var resultArr = [];
	for(var i = 0; len = param.length, i < len; i++) {
		var x = param[i].x ? param[i].x : param[i].lng;
		var y = param[i].y ? param[i].y : param[i].lat;
		if(!x&&!y){
			x=param[i].longitude;
			y=param[i].lantitude;
		}
		x = parseFloat(x);
		y = parseFloat(y);
		if((135.05 > x && x > 73.67) && (53.55 > y && y > 3.87)) {
			//转成火星（国测）坐标系 ，WGS84转GCj02
			var valueObj = {
				lng: x,
				lat: y
			};
			var AmapPoint = coordtransform.wgs84togcj02(valueObj.lng, valueObj.lat);
			param[i].lng = AmapPoint[0];
			param[i].lat = AmapPoint[1];
			if(param[i].uploadDate){
				var  dateStr=param[i].uploadDate.split('-').join('/');
				param[i].loc_time = new Date(dateStr).getTime();
			}
			resultArr.push(param[i]);
		}
	}
	return resultArr;
}

/** 将高德地图坐标数组n个转换成大地坐标系数组并返回Arr*/
function AmapToWGS84Arr(dataArr) {
	//1.先过滤坐标为0.0，null，undefined，''等情况的数据
	var resultArr = [];
	var param=[]; 
		param=dataArr;
	for(var i = 0; len = param.length, i < len; i++) {
		var x = param[i].x ? param[i].x : param[i].lng;
		var y = param[i].y ? param[i].y : param[i].lat;
		x = parseFloat(x);
		y = parseFloat(y);
		if((135.05 > x && x > 73.67) && (53.55 > y && y > 3.87)) {
			//先转成火星坐标系 ，WGS84转GCj02
			var valueObj = {
				lng: x,
				lat: y
			};
			var gcj02Point =  coordtransform.gcj02towgs84(valueObj.lng, valueObj.lat);
			param[i].lng = gcj02Point[0];
			param[i].lat = gcj02Point[1];
			if(param[i].uploadDate){
				param[i].loc_time = new Date(param[i].uploadDate).getTime();
			}
			resultArr.push(param[i]);
		}
	}
	
	return resultArr;
}